package com.zhongwang.mms.util;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Map;

/**
 * @ClassName： LogFormatUItil
 * @Description： 操作日志工具类
 * @Author： 徐一贺
 * @Date： 2020年7月11日11:24:54
 * @Version： V1.0
 **/
public class LogFormatUtil {
    /**
     * @方法名: getUpdateResult
     * @方法描述: 格式化输出更新日志内容
     * @设计思路: 根据传入的fieldMap 字段名与显示名映射和beforeObject与afterObject做处理进行输出格式后的日志。
     * @使用方法： 传入参数，编辑或修改说明，字段名与显示名映射Map，例如：
     * Map<String, String> fieldMap = new HashMap<String, String>();
     * fieldMap.put("ityProName","项目名称");
     * fieldMap.put("ityPosition","区位");
     * fieldMap.put("ityWhiName","仓库");
     * fieldMap.put("ityBookkeepingDate","记账日期");
     * fieldMap.put("ityRemark","备注");
     * 把以上的fieldMap作为第二参数传入，注意：
     * 1.map中传入的对应字段名必须有public修饰的get方法，或者字段本身用public修饰。
     * 2.map中有什么，日志结果就显示什么。
     * 结果样例：
     * ┌──────────────────────┐
     * │     编辑前        行为         编辑后      │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    项目名称:AAA   未改      项目名称:AAA   │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    仓库:A067      改成      仓库:A064      │
     * └──────────────────────┘
     * @作者: 徐一贺
     * @创建时间: 2020年7月11日13:40:29
     * @手机号: 18241927380
     * @参数: [title]：编辑或修改说明。[fieldMap]：字段名与显示名映射Map。[beforeObject]：修改前的对象。[afterObject]：修改后的对象
     * @返回值: logString 格式化结果
     * @抛出异常: 无异常抛出
     * @版本: v 1.0.0
     */
    public static String getUpdateResult(String title, Map<String, String> fieldMap, Object beforeObject, Object afterObject) {
        //初始化日志
        StringBuffer logString = new StringBuffer("<div class='row'><div class='col-sm-12'>" + title + "</div></div>");
        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-5' style='color:red;text-align:center;'>编辑前</div><div class='col-sm-2'>行为</div><div class='col-sm-5' style='color:green;text-align:center;'>编辑后</div></div>");
        try {
            //得到class
            Class beforeClass = beforeObject.getClass();
            Class afterClass = afterObject.getClass();
            //得到所有属性
            Field[] beforeFields = beforeClass.getDeclaredFields();
            Field[] afterFields = afterClass.getDeclaredFields();
            //循环迭代
            for (int i = 0; i < beforeFields.length; i++) {
                Field beforeField = beforeFields[i];
                Field afterField = afterFields[i];
                //打开私有访问
                beforeField.setAccessible(true);
                afterField.setAccessible(true);
                //获取属性
                String beforeName = beforeField.getName();
                String afterName = afterField.getName();
                //获取属性对应的列名
                String fieldMapperValue = fieldMap.get(beforeName);
                //获取之前的属性值
                Object beforeValue = beforeField.get(beforeObject);
                if (beforeValue == null) {
                    beforeValue = "";
                }
                //获取之后的属性值
                Object afterValue = afterField.get(afterObject);
                if (afterValue == null) {
                    afterValue = "";
                }
                if (fieldMapperValue != null) {
                    if (!beforeValue.toString().equals(afterValue.toString())) {
                        if (!beforeValue.equals("") && beforeField.getType().toString().equals("class java.util.Date")) {
                            String strDateFormat = "yyyy-MM-dd HH:mm:ss";
                            SimpleDateFormat df = new SimpleDateFormat(strDateFormat);
                            logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-5' style='color:red;text-align:left;'>" + fieldMapperValue + ":" + df.format(beforeValue) + "</div><div class='col-sm-2' style='color:#FF8000;text-align:center;'> 改成 </div><div class='col-sm-5' style='color:green;text-align:left;'>" + fieldMapperValue + ":" + df.format(afterValue) + "</div></div>");
                        } else {
                            logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-5' style='color:red;text-align:left;'>" + fieldMapperValue + ":" + beforeValue + "</div><div class='col-sm-2' style='color:#FF8000;text-align:center;'> 改成 </div><div class='col-sm-5' style='color:green;text-align:left;'>" + fieldMapperValue + ":" + afterValue + "</div></div>");
                        }
                    } else {
                        if (!beforeValue.equals("") && beforeField.getType().toString().equals("class java.util.Date")) {
                            String strDateFormat = "yyyy-MM-dd";
                            SimpleDateFormat df = new SimpleDateFormat(strDateFormat);
                            logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-5' style='color:red;text-align:left;'>" + fieldMapperValue + ":" + df.format(beforeValue) + "</div><div class='col-sm-2' style='color:#333333;text-align:center;'> 未改 </div><div class='col-sm-5' style='color:green;text-align:left;'>" + fieldMapperValue + ":" + df.format(afterValue) + "</div></div>");
                        } else {
                            logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-5' style='color:red;text-align:left;'>" + fieldMapperValue + ":" + beforeValue + "</div><div class='col-sm-2' style='color:#333333;text-align:center;'> 未改 </div><div class='col-sm-5' style='color:green;text-align:left;'>" + fieldMapperValue + ":" + afterValue + "</div></div>");
                        }
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            logString = new StringBuffer("日志工具类-格式化输出更新日志内容方法异常！");
            return logString.toString();
        }
        return logString.toString();
    }

    /**
     * @方法名: getInsertResult
     * @方法描述: 格式化输出插入日志内容
     * @设计思路: 根据传入的fieldMap 字段名与显示名映射和beforeObject与afterObject做处理进行输出格式后的日志。
     * @使用方法： 传入参数，编辑或修改说明，字段名与显示名映射Map，例如：
     * Map<String, String> fieldMap = new HashMap<String, String>();
     * fieldMap.put("ityProName","项目名称");
     * fieldMap.put("ityPosition","区位");
     * fieldMap.put("ityWhiName","仓库");
     * fieldMap.put("ityBookkeepingDate","记账日期");
     * fieldMap.put("ityRemark","备注");
     * 把以上的fieldMap作为第二参数传入，注意：
     * 1.map中传入的对应字段名必须有public修饰的get方法，或者字段本身用public修饰。
     * 2.map中有什么，日志结果就显示什么。
     * 结果样例：
     * ┌──────────────────────┐
     * │     列名                       内容      │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    项目名称                     AAA      │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    仓库                         A064     │
     * └──────────────────────┘
     * @作者: 徐一贺
     * @创建时间: 2020年7月11日14:36:39
     * @手机号: 18241927380
     * @参数: [title]：编辑或修改说明。[fieldMap]：字段名与显示名映射Map。[insertObject]：插入的对象。
     * @返回值: logString 格式化结果
     * @抛出异常: 无异常抛出
     * @版本: v 1.0.0
     */
    public static String getInsertResult(String title, Map<String, String> fieldMap, Object insertObject) {
        //初始化日志
        StringBuffer logString = new StringBuffer("<div class='row'><div class='col-sm-12'>" + title + "</div></div>");
        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:green;text-align:center;'>列名</div><div class='col-sm-6' style='color:green;text-align:center;'>内容</div></div>");
        try {
            //得到class
            Class insertClass = insertObject.getClass();
            //得到所有属性
            Field[] insertFields = insertClass.getDeclaredFields();
            //循环迭代
            for (int i = 0; i < insertFields.length; i++) {
                Field insertField = insertFields[i];
                //打开私有访问
                insertField.setAccessible(true);
                //获取属性
                String insertName = insertField.getName();
                //获取属性对应的列名
                String fieldMapperValue = fieldMap.get(insertName);
                //获取之前的属性值
                Object insertValue = insertField.get(insertObject);
                if (fieldMapperValue != null) {
                    if (insertValue == null) {
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:green;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:green;text-align:left;'></div></div>");
                    } else if (insertField.getType().toString().equals("class java.util.Date")) {
                        String strDateFormat = "yyyy-MM-dd HH:mm:ss";
                        SimpleDateFormat df = new SimpleDateFormat(strDateFormat);
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:green;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:green;text-align:left;'>" + df.format(insertValue) + "</div></div>");
                    } else {
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:green;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:green;text-align:left;'>" + insertValue + "</div></div>");
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            logString = new StringBuffer("日志工具类-格式化输出插入日志内容方法异常！");
            return logString.toString();
        }
        return logString.toString();
    }

    /**
     * @方法名: getDeleteResult
     * @方法描述: 格式化输出删除日志内容
     * @设计思路: 根据传入的fieldMap 字段名与显示名映射和beforeObject与afterObject做处理进行输出格式后的日志。
     * @使用方法： 传入参数，编辑或修改说明，字段名与显示名映射Map，例如：
     * Map<String, String> fieldMap = new HashMap<String, String>();
     * fieldMap.put("ityProName","项目名称");
     * fieldMap.put("ityPosition","区位");
     * fieldMap.put("ityWhiName","仓库");
     * fieldMap.put("ityBookkeepingDate","记账日期");
     * fieldMap.put("ityRemark","备注");
     * 把以上的fieldMap作为第二参数传入，注意：
     * 1.map中传入的对应字段名必须有public修饰的get方法，或者字段本身用public修饰。
     * 2.map中有什么，日志结果就显示什么。
     * 结果样例：
     * ┌──────────────────────┐
     * │     列名                       内容      │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    项目名称                     AAA      │
     * └──────────────────────┘
     * ┌──────────────────────┐
     * │    仓库                         A064     │
     * └──────────────────────┘
     * @作者: 徐一贺
     * @创建时间: 2020年7月11日14:36:39
     * @手机号: 18241927380
     * @参数: [title]：编辑或修改说明。[fieldMap]：字段名与显示名映射Map。[insertObject]：插入的对象。
     * @返回值: logString 格式化结果
     * @抛出异常: 无异常抛出
     * @版本: v 1.0.0
     */
    public static String getDeleteResult(String title, Map<String, String> fieldMap, Object insertObject) {
        //初始化日志
        StringBuffer logString = new StringBuffer("<div class='row'><div class='col-sm-12'>" + title + "</div></div>");
        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:red;text-align:center;'>列名</div><div class='col-sm-6' style='color:red;text-align:center;'>内容</div></div>");
        try {
            //得到class
            Class insertClass = insertObject.getClass();
            //得到所有属性
            Field[] insertFields = insertClass.getDeclaredFields();
            //循环迭代
            for (int i = 0; i < insertFields.length; i++) {
                Field insertField = insertFields[i];
                //打开私有访问
                insertField.setAccessible(true);
                //获取属性
                String insertName = insertField.getName();
                //获取属性对应的列名
                String fieldMapperValue = fieldMap.get(insertName);
                //获取之前的属性值
                Object insertValue = insertField.get(insertObject);
                if (fieldMapperValue != null) {
                    if (insertValue == null) {
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:red;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:red;text-align:left;'></div></div>");
                    } else if (insertField.getType().toString().equals("class java.util.Date")) {
                        String strDateFormat = "yyyy-MM-dd HH:mm:ss";
                        SimpleDateFormat df = new SimpleDateFormat(strDateFormat);
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:red;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:red;text-align:left;'>" + df.format(insertValue) + "</div></div>");
                    } else {
                        logString.append("<div class='row' style='border: 1px black solid'><div class='col-sm-6' style='color:red;text-align:left;'>" + fieldMapperValue + "</div><div class='col-sm-6' style='color:red;text-align:left;'>" + insertValue + "</div></div>");
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            logString = new StringBuffer("日志工具类-格式化输出删除日志内容方法异常！");
            return logString.toString();
        }
        return logString.toString();
    }

}
